from shapely.geometry import Polygon

def fix_polygon_orientation(vertices):
    """
    将顺时针排列的多边形顶点转换为逆时针排列，同时保持起始点不变
    参数:
        vertices: 多边形顶点列表，格式 [(x0,y0), (x1,y1), ...]
    返回:
        修正后的顶点列表（逆时针方向，起始点不变）
    """
    # 1. 检查多边形方向
    n = len(vertices)
    if n < 3:
        raise ValueError("多边形至少需要3个顶点")

    # 2. 计算带符号面积判断方向
    area = 0.0
    for i in range(n):
        x1, y1 = vertices[i]
        x2, y2 = vertices[(i + 1) % n]  # 循环连接到第一个点
        area += (x1 * y2 - x2 * y1)

    # 3. 如果面积为正，说明已经是逆时针，直接返回
    if area > 0:
        return vertices

    # 4. 顺时针多边形：保持起始点不变，反转其余点的顺序
    # 起始点 + 其余点反转（不包括起始点）
    fixed_vertices = list(reversed(vertices[1:]))

    return fixed_vertices


def fix_shapely_polygon_orientation(poly):
    """
    修正Shapely多边形的方向（外环逆时针，内环顺时针）

    参数:
        poly: Shapely Polygon对象

    返回:
        修正方向后的Polygon对象
    """
    # 1. 处理外环
    exterior = list(poly.exterior.coords)
    if is_clockwise(exterior):
        exterior = fix_polygon_orientation(exterior)


    return Polygon(exterior)


def is_clockwise(vertices):
    """判断多边形顶点是否顺时针排列"""
    area = 0.0
    n = len(vertices)
    for i in range(n):
        x1, y1 = vertices[i]
        x2, y2 = vertices[(i + 1) % n]
        area += (x1 * y2 - x2 * y1)
    return area < 0